﻿namespace Common.Protocol
{
    using System;
    using System.Drawing;

    public class ChannelConfig
    {
        // TODO: забрати! - костиль для присвоєння імен каналів
        private static int i = 0;

        // колір каналу
        public Int32 IntColor { get; private set; }

        // період реєстрації, мілісекунд. 0 - реєстрація вимкнена
        public Int16 RegPeriod { get; private set; }

        // назва каналу ("Аналог 1" і т.д.)
        private char[] name = new char[26];
        public string Name { get; private set; }

        // тип датчика - індекс для sensors_tb
        public char SensorType { get; private set; }

        // одиниці вимірювання
        public char[] ValueUnits = new char[11];

        // границі вимірювання
        public float ValueMin { get; private set; }
        public float ValueMax { get; private set; }

        public Color Color { get; private set; }

        public bool ParseFromBinary(byte[] bytes, int pos)
        {
            int position = pos;
            this.IntColor = BitConverter.ToInt32(bytes, position);

            byte[] colorBytes = new byte[4];
            colorBytes = BitConverter.GetBytes(this.IntColor);
            int r = BitConverter.ToInt32(new byte[] {colorBytes[2], 0, 0, 0}, 0);
            int g = BitConverter.ToInt32(new byte[] {colorBytes[1], 0, 0, 0 }, 0);
            int b = BitConverter.ToInt32(new byte[] { colorBytes[0], 0, 0, 0}, 0);

            this.Color = Color.FromArgb(r, g, b);

            position += 4;
            this.RegPeriod = BitConverter.ToInt16(bytes, position);
            position += 2;

            System.Text.Encoding.UTF8.GetChars(bytes, position, 26, this.name, 0);
            position += 26;

            foreach (var c in this.name)
            {
                if (c != '\0')
                {
                    this.Name += c;
                }
            }

            // TODO: прибрати цей костиль!!!!
            if (this.Name == null)
            {
                this.Name = i++.ToString();
            }


            this.SensorType = BitConverter.ToChar(bytes, position);
            position++;
            for (int i = 0; i < this.ValueUnits.Length; i++)
            {
                this.ValueUnits[i] = BitConverter.ToChar(bytes, position);
                position++;
            }

            this.ValueMin = BitConverter.ToSingle(bytes, position);
            position += 4;
            this.ValueMax = BitConverter.ToSingle(bytes, position);

            return (this.ValueMin != this.ValueMax);
        }
    }
}